package com.itcam.interview.pro00.thread;

import java.util.concurrent.CountDownLatch;

/**
 * @author : Cammy.Wu
 * Description : 
 */

public class SleepInterruptExample {
    public static void main(String[] args) throws InterruptedException {
//        sleepInterrupt();
        // CountDownLatch，它可以让一个或多个线程等待其他线程完成一组操作后再继续执行。
        // CountDownLatch 或者 Semaphore 来协调线程，减少直接中断线程带来的问题。
        // 创建一个CountDownLatch，初始值为3，表示有3个子线程任务
        CountDownLatch latch = new CountDownLatch(3);
        for (int i = 0; i < 3; i++) {
            final int taskNumber = i;
            Thread thread = new Thread(() -> {
                try {
                    // 模拟子线程执行任务
                    System.out.println("子线程 " + taskNumber + " 开始执行任务");
                    Thread.sleep((long) (Math.random() * 3000));
                    System.out.println("子线程 " + taskNumber + " 完成任务");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    latch.countDown();
                }
            });
            thread.start();
        }

        latch.await();

        System.out.println("所有子线程任务完成，主线程继续执行");
    }

    private static void sleepInterrupt() {
        Thread thread = new Thread(() -> {
            try {
                // 线程休眠5秒，模拟长时间任务
                Thread.sleep(5000);
                System.out.println("线程休眠结束，继续执行任务");
            } catch (InterruptedException e) {
                System.out.println("线程在休眠时被中断");
                // 这里可以做一些中断后的处理，比如资源清理等
                Thread.currentThread().interrupt(); // 重新设置中断标志，以便上层方法知晓
            }
        });

        thread.start();

        // 主线程休眠1秒，确保子线程有时间开始休眠
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 中断子线程
        thread.interrupt();
    }
}
